import queue
import random
from multiprocessing.managers import BaseManager
from multiprocessing import freeze_support

# 发送任务的队列
task_queue = queue.Queue()
# 接收结果的队列
result_queue = queue.Queue()


# 从BaseManager继承的QueueManager
class QueueManager(BaseManager):
    pass


def gettask():
    return task_queue;


def getresult():
    return result_queue;


def test():
    # 把两个queue都注册到网络上,callable参数关联了Queue对象
    # (第一点windows下绑定调用接口不能使用lambda，所以只能先定义函数再绑定 第二点绑定端口并设置验证码，windows下需要填写ip地址，linux下不填默认为本地 )
    QueueManager.register('get_task_queue', callable=gettask)
    QueueManager.register('get_result_queue', callable=getresult)
    # 绑定端口5000,设置验证码'abc'
    server_addr = '127.0.0.1'
    manager = QueueManager(address=(server_addr, 5000), authkey=b'abc')
    # 启动Queue
    manager.start()
    # 获得通过网络访问的Queue对象
    task = manager.get_task_queue()
    result = manager.get_result_queue()
    # 放几个任务进去:
    for i in range(10):
        n = random.randint(0, 10000)
        print('Put task %d...' % n)
        task.put(n)
    # 从result队列读取结果
    print('try get results...')
    for i in range(10):
        r = result.get(timeout=10)
        print('result:%s' % r)
    # 关闭:
    manager.shutdown()
    print('master exit.')


if __name__ == '__main__':
    # windows下多进程可能会炸，添加这句可以缓解
    freeze_support()
    test();
